package com.engine.kq.cmd.report;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.kq.biz.*;
import com.engine.kq.util.KQDurationCalculatorUtil;
import com.engine.kq.util.PageUidFactory;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.general.TimeUtil;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.hrm.company.DepartmentComInfo;
import weaver.hrm.company.SubCompanyComInfo;
import weaver.hrm.job.JobTitlesComInfo;
import weaver.hrm.resource.ResourceComInfo;
import weaver.systeminfo.SystemEnv;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.*;

public class GetKQReportCmd extends AbstractCommonCommand<Map<String, Object>> {

	public GetKQReportCmd(Map<String, Object> params, User user) {
		this.user = user;
		this.params = params;
	}

	@Override
	public Map<String, Object> execute(CommandContext commandContext) {
		Map<String,Object> retmap = new HashMap<String,Object>();
		RecordSet rs = new RecordSet();
        RecordSet rsCsd = new RecordSet();
		String sql = "";
		try{
			String pageUid = PageUidFactory.getHrmPageUid("KQReport");

			SubCompanyComInfo subCompanyComInfo = new SubCompanyComInfo();
		  DepartmentComInfo departmentComInfo = new DepartmentComInfo();
			ResourceComInfo resourceComInfo = new ResourceComInfo();
			JobTitlesComInfo jobTitlesComInfo = new JobTitlesComInfo();
			KQLeaveRulesBiz kqLeaveRulesBiz = new KQLeaveRulesBiz();
			KQReportBiz kqReportBiz = new KQReportBiz();

			JSONObject jsonObj = JSON.parseObject(Util.null2String(params.get("data")));
			String attendanceSerial = Util.null2String(jsonObj.get("attendanceSerial"));
			String fromDate = Util.null2String(jsonObj.get("fromDate"));
			String toDate = Util.null2String(jsonObj.get("toDate"));
			String typeselect =Util.null2String(jsonObj.get("typeselect"));
			if(typeselect.length()==0)typeselect = "3";
			if(!typeselect.equals("") && !typeselect.equals("0")&& !typeselect.equals("6")){
				if(typeselect.equals("1")){
					fromDate = TimeUtil.getCurrentDateString();
					toDate = TimeUtil.getCurrentDateString();
				}else{
					fromDate = TimeUtil.getDateByOption(typeselect,"0");
					toDate = TimeUtil.getDateByOption(typeselect,"1");
				}
			}
			String subCompanyId = Util.null2String(jsonObj.get("subCompanyId"));
			String departmentId = Util.null2String(jsonObj.get("departmentId"));
			String resourceId = Util.null2String(jsonObj.get("resourceId"));
			String allLevel = Util.null2String(jsonObj.get("allLevel"));
			String isNoAccount = Util.null2String(jsonObj.get("isNoAccount"));
			String viewScope = Util.null2String(jsonObj.get("viewScope"));
			String isFromMyAttendance = Util.null2String(jsonObj.get("isFromMyAttendance"));//是否是来自我的考勤的请求，如果是，不加载考勤报表权限共享的限制，不然我的考勤会提示无权限
			int pageIndex = Util.getIntValue(Util.null2String(jsonObj.get("pageIndex")), 1);
			int pageSize =  KQReportBiz.getPageSize(Util.null2String(jsonObj.get("pageSize")),pageUid,user.getUID());
			int count = 0;
			int pageCount = 0;
			int isHavePre = 0;
			int isHaveNext = 0;


			String rightSql = kqReportBiz.getReportRight("1",""+user.getUID(),"a");
			if(isFromMyAttendance.equals("1")){
				rightSql = "";
			}

			List<Map<String, Object>> leaveRules = kqLeaveRulesBiz.getAllLeaveRules();
			List<Object> columns = new ArrayList();
			Map<String,Object> column = null;
			List<Object> datas = new ArrayList();
			Map<String,Object> data = null;
			Map<String,Object> mapChildColumnInfo = null;
			List<Object> childColumns = null;
			KQReportFieldComInfo kqReportFieldComInfo = new KQReportFieldComInfo();
			while (kqReportFieldComInfo.next()){
				if(Util.null2String(kqReportFieldComInfo.getParentid()).length()>0)continue;
				if(!kqReportFieldComInfo.getReportType().equals("all") && !kqReportFieldComInfo.getReportType().equals("month"))continue;
				if("leave".equalsIgnoreCase(kqReportFieldComInfo.getFieldname())&&leaveRules.size()==0){
					continue;
				}
				column = new HashMap();
				column.put("title", SystemEnv.getHtmlLabelNames(kqReportFieldComInfo.getFieldlabel(), user.getLanguage()));
				column.put("unit", KQReportBiz.getUnitType(kqReportFieldComInfo, user));
				column.put("dataIndex", kqReportFieldComInfo.getFieldname());
				column.put("type", kqReportFieldComInfo.getFieldname());
				column.put("key", kqReportFieldComInfo.getFieldname());
				mapChildColumnInfo = this.getChildColumnsInfo(kqReportFieldComInfo.getFieldname(),user);
				childColumns = (List<Object>)mapChildColumnInfo.get("childColumns");
				if(childColumns.size()>0) {//跨列width取子列的width
					column.put("rowSpan", 1);
					column.put("width", mapChildColumnInfo.get("sumChildColumnWidth"));
					column.put("children", childColumns);
				}else{
					column.put("rowSpan", 3);
					column.put("width", Util.getIntValue(kqReportFieldComInfo.getWidth()));
				}
				column.put("showDetial",kqReportFieldComInfo.getShowDetial());
				columns.add(column);
			}

			boolean isEnd = false;
			Calendar cal = DateUtil.getCalendar();
			String today = DateUtil.getCurrentDate();
//			if(DateUtil.compDate(today, toDate)>0){//结束日期不大于今天
//				toDate = today;
//				if(DateUtil.compDate(today, fromDate)>0){//结束日期不大于今天
//          fromDate = today;
//        }
//			}

			childColumns = new ArrayList<>();
			for(String date=fromDate; !isEnd;) {
				if(date.equals(toDate)) isEnd = true;
				column = new HashMap();
				column.put("title", DateUtil.geDayOfMonth(date));
				column.put("dataIndex", date);
				column.put("key", date);
				column.put("type", date);
				column.put("rowSpan", 1);
				column.put("width", 65);
				column.put("isCalendar", 1);
				childColumns.add(column);
				cal.setTime(DateUtil.parseToDate(date));
				date = DateUtil.getDate(cal.getTime(), 1);
			}

			column = new HashMap();
			column.put("title", SystemEnv.getHtmlLabelName(386476, user.getLanguage()));
			column.put("dataIndex", "kqCalendar");
			column.put("key", "kqCalendar");
			if(childColumns.size()>0) {//跨列width取子列的width
				column.put("rowSpan", 1);
				column.put("width", childColumns.size()*65);
				column.put("children", childColumns);
			}
			columns.add(column);
			String forgotBeginWorkCheck_field = " sum(b.forgotBeginWorkCheck) ";

      if(rs.getDBType().equalsIgnoreCase("oracle")&&!Util.null2String(rs.getOrgindbtype()).equals("dm")&&!Util.null2String(rs.getOrgindbtype()).equals("st")) {
        forgotBeginWorkCheck_field = " sum(nvl(b.forgotBeginWorkCheck,0))  ";
      }else if((rs.getDBType()).equalsIgnoreCase("mysql")){
        forgotBeginWorkCheck_field = " sum(ifnull(b.forgotBeginWorkCheck,0)) ";
      }else {
        forgotBeginWorkCheck_field = " sum(isnull(b.forgotBeginWorkCheck,0)) ";
      }

			String backFields = " a.id,a.lastname,a.workcode,a.dsporder,b.resourceid,b.subcompanyid,b.departmentid,b.jobtitle," +
													" sum(b.workdays) as workdays,sum(b.workMins) as workMins,sum(b.attendancedays) as attendancedays," +
													" sum(b.attendanceMins) as attendanceMins,sum(b.beLate) as beLate,sum(b.beLateMins) as beLateMins, " +
													" sum(b.graveBeLate) as graveBeLate, sum(b.graveBeLateMins) as graveBeLateMins,sum(b.leaveEearly) as leaveEearly," +
													" sum(b.leaveEarlyMins) as leaveEarlyMins, sum(b.graveLeaveEarly) as graveLeaveEarly, " +
												  " sum(b.graveLeaveEarlyMins) as graveLeaveEarlyMins,sum(b.absenteeism) as absenteeism, " +
													" sum(b.absenteeismMins) as absenteeismMins, sum(b.forgotCheck)+"+forgotBeginWorkCheck_field+" as forgotCheck ";
			if(rs.getDBType().equals("oracle")){
				backFields = 	"/*+ index(kq_format_total IDX_KQ_FORMAT_TOTAL_KQDATE) */ "+backFields;
			}
			String sqlFrom = " from hrmresource a, kq_format_total b where a.id= b.resourceid and b.kqdate >='"+fromDate+"' and b.kqdate <='"+toDate+"'";
			String sqlWhere = rightSql;
			String groupBy = " group by a.id,a.lastname,a.workcode,a.dsporder,b.resourceid,b.subcompanyid,b.departmentid,b.jobtitle ";
			if(subCompanyId.length()>0){
				sqlWhere +=" and b.subcompanyid in("+subCompanyId+") ";
			}

			if(departmentId.length()>0){
				sqlWhere +=" and b.departmentid in("+departmentId+") ";
			}

			if(resourceId.length()>0){
				sqlWhere +=" and b.resourceid in("+resourceId+") ";
			}

			if(viewScope.equals("4")){//我的下属
				if(allLevel.equals("1")){//所有下属
					sqlWhere+=" and a.managerstr like '%,"+user.getUID()+",%'";
				}else{
					sqlWhere+=" and a.managerid="+user.getUID();//直接下属
				}
			}
			if (!"1".equals(isNoAccount)) {
				sqlWhere += " and a.loginid is not null "+(rs.getDBType().equals("oracle")?"":" and a.loginid<>'' ");
			}

			sql = " select count(*) as c from ( select 1 as c "+sqlFrom+sqlWhere+groupBy+") t";
			rs.execute(sql);
			if (rs.next()){
				count = rs.getInt("c");
			}

			if (count <= 0) {
				pageCount = 0;
			}

			pageCount = count / pageSize + ((count % pageSize > 0) ? 1 : 0);

			isHaveNext = (pageIndex + 1 <= pageCount) ? 1 : 0;

			isHavePre = (pageIndex - 1 >= 1) ? 1 : 0;

			String orderBy = " order by t.dsporder asc, t.lastname asc ";
			String descOrderBy = " order by t.dsporder desc, t.lastname desc ";
			sql = backFields + sqlFrom  + sqlWhere + groupBy;

			if (pageIndex > 0 && pageSize > 0) {
				if (rs.getDBType().equals("oracle")||rs.getDBType().equals("dm")||rs.getDBType().equals("st")) {
					sql = " select * from (select " + sql+") t "+orderBy;
					sql = "select * from ( select row_.*, rownum rownum_ from ( " + sql + " ) row_ where rownum <= "
									+ (pageIndex * pageSize) + ") where rownum_ > " + ((pageIndex - 1) * pageSize);
				} else if (rs.getDBType().equals("mysql")) {
					sql = " select * from (select " + sql+") t "+orderBy;
					sql = "select t1.* from (" + sql + ") t1 limit " + ((pageIndex - 1) * pageSize) + "," + pageSize;
				} else {
					orderBy = " order by dsporder asc, lastname asc ";
					descOrderBy = " order by dsporder desc, lastname desc ";
					if (pageIndex > 1) {
						int topSize = pageSize;
						if (pageSize * pageIndex > count) {
							topSize = count - (pageSize * (pageIndex - 1));
						}
						sql = " select top " + topSize + " * from ( select top  " + topSize + " * from ( select top "
										+ (pageIndex * pageSize) + sql + orderBy+ " ) tbltemp1 " + descOrderBy + ") tbltemp2 " + orderBy;
					} else {
						sql = " select top " + pageSize + sql+orderBy;
					}
				}
			} else {
				sql = " select " + sql;
			}
			Map<String,Object> flowData = kqReportBiz.getFlowData(params,user);
			rs.execute(sql);
			while (rs.next()) {
				data = new HashMap<>();
				kqReportFieldComInfo.setTofirstRow();
				String id = rs.getString("id");
				data.put("resourceId", id);
				while (kqReportFieldComInfo.next()) {
					if (!Util.null2String(kqReportFieldComInfo.getIsdataColumn()).equals("1")) continue;
					if (!kqReportFieldComInfo.getReportType().equals("all") && !kqReportFieldComInfo.getReportType().equals("month"))
						continue;
					if ("leave".equalsIgnoreCase(kqReportFieldComInfo.getFieldname()) && leaveRules.size() == 0) {
						continue;
					}
					String fieldName = kqReportFieldComInfo.getFieldname();
					String fieldValue = "";
					if (fieldName.equals("subcompany")) {
						String tmpSubcompanyId = Util.null2String(rs.getString("subcompanyid"));
						if (tmpSubcompanyId.length() == 0) {
							tmpSubcompanyId = Util.null2String(resourceComInfo.getSubCompanyID(id));
						}
						data.put("subcompanyId", tmpSubcompanyId);
						fieldValue = subCompanyComInfo.getSubCompanyname(tmpSubcompanyId);
						fieldValue = subCompanyComInfo.getSubcompanyRealPath(tmpSubcompanyId,"/","0");
					} else if (fieldName.equals("department")) {
						String tmpDepartmentId = Util.null2String(rs.getString("departmentid"));
						if (tmpDepartmentId.length() == 0) {
							tmpDepartmentId = Util.null2String(resourceComInfo.getDepartmentID(id));
						}
						data.put("departmentId", tmpDepartmentId);
						fieldValue = departmentComInfo.getDepartmentname(tmpDepartmentId);
						fieldValue = departmentComInfo.getDepartmentRealPath(tmpDepartmentId,"/","0");
					} else if (fieldName.equals("jobtitle")) {
						String tmpJobtitleId = Util.null2String(rs.getString("jobtitle"));
						if (tmpJobtitleId.length() == 0) {
							tmpJobtitleId = Util.null2String(resourceComInfo.getJobTitle(id));
						}
						data.put("jobtitleId", tmpJobtitleId);
						fieldValue = jobTitlesComInfo.getJobTitlesname(tmpJobtitleId);
					} else if (fieldName.equals("attendanceSerial")) {
						List<String> serialIds = null;
						if (attendanceSerial.length() > 0) {
							serialIds = Util.splitString2List(attendanceSerial, ",");
						}
						for (int i = 0; serialIds != null && i < serialIds.size(); i++) {
							data.put(serialIds.get(i), kqReportBiz.getSerialCount(id, fromDate, toDate, serialIds.get(i)));
						}
					} else if (kqReportFieldComInfo.getParentid().equals("overtime") || kqReportFieldComInfo.getParentid().equals("overtime_nonleave")
							|| kqReportFieldComInfo.getParentid().equals("overtime_4leave") || fieldName.equals("businessLeave") || fieldName.equals("officialBusiness")) {
						if (fieldName.equals("overtimeTotal")) {
							double workingDayOvertime_4leave = Util.getDoubleValue(Util.null2String(flowData.get(id + "|workingDayOvertime_4leave")));
							workingDayOvertime_4leave = workingDayOvertime_4leave < 0 ? 0 : workingDayOvertime_4leave;
							double restDayOvertime_4leave = Util.getDoubleValue(Util.null2String(flowData.get(id + "|restDayOvertime_4leave")));
							restDayOvertime_4leave = restDayOvertime_4leave < 0 ? 0 : restDayOvertime_4leave;
							double holidayOvertime_4leave = Util.getDoubleValue(Util.null2String(flowData.get(id + "|holidayOvertime_4leave")));
							holidayOvertime_4leave = holidayOvertime_4leave < 0 ? 0 : holidayOvertime_4leave;

							double workingDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(flowData.get(id + "|workingDayOvertime_nonleave")));
							workingDayOvertime_nonleave = workingDayOvertime_nonleave < 0 ? 0 : workingDayOvertime_nonleave;
							double restDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(flowData.get(id + "|restDayOvertime_nonleave")));
							restDayOvertime_nonleave = restDayOvertime_nonleave < 0 ? 0 : restDayOvertime_nonleave;
							double holidayOvertime_nonleave = Util.getDoubleValue(Util.null2String(flowData.get(id + "|holidayOvertime_nonleave")));
							holidayOvertime_nonleave = holidayOvertime_nonleave < 0 ? 0 : holidayOvertime_nonleave;

							fieldValue = KQDurationCalculatorUtil.getDurationRound(String.valueOf(workingDayOvertime_4leave + restDayOvertime_4leave + holidayOvertime_4leave +
									workingDayOvertime_nonleave + restDayOvertime_nonleave + holidayOvertime_nonleave));
						} else if (fieldName.equals("businessLeave") || fieldName.equals("officialBusiness")) {
							String businessLeaveData = Util.null2s(Util.null2String(flowData.get(id + "|" + fieldName)), "0.0");
							String backType = fieldName + "_back";
							String businessLeavebackData = Util.null2s(Util.null2String(flowData.get(id + "|" + backType)), "0.0");
							String businessLeave = "";
							try {
								//以防止出现精度问题
								if (businessLeaveData.length() == 0) {
									businessLeaveData = "0.0";
								}
								if (businessLeavebackData.length() == 0) {
									businessLeavebackData = "0.0";
								}
								BigDecimal b_businessLeaveData = new BigDecimal(businessLeaveData);
								BigDecimal b_businessLeavebackData = new BigDecimal(businessLeavebackData);
								businessLeave = b_businessLeaveData.subtract(b_businessLeavebackData).toString();
							} catch (Exception e) {
							}
							fieldValue = KQDurationCalculatorUtil.getDurationRound(businessLeave);
						} else {
							fieldValue = KQDurationCalculatorUtil.getDurationRound(Util.null2String(flowData.get(id + "|" + fieldName)));
						}
					} else if(fieldName.equals("attendance")){
                        //2.增加出勤率字段。计算规则为：出勤率=实际出勤天数/应出勤天数。

                        try {
                            //应出勤天数 "workdays"
                            float fltWorkdays = Util.getFloatValue(rs.getString("workdays"));
                            //实际出勤天数 "attendancedays"
                            float fltAttendancedays = Util.getFloatValue(rs.getString("attendancedays"));
                            DecimalFormat df=new DecimalFormat("0.00");//设置保留位数
                            fieldValue = df.format(fltAttendancedays/fltWorkdays);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }else if(fieldName.equals("salaryrange")){
                        //3.增加工资范围字段。
                        //数据来源为通过人员卡片自定义字段“工资核算范围”在建模表中匹配BPM工资核算范围，查询出“工资核算范围”显示到考勤报表中。例如人员卡片工资核算范围是A201，则可在建模表中查询出工资核算范围为A2。

                        try {
                            rsCsd.executeQuery("select gzhsfw from uf_gzfw where id = (select field23 from cus_fielddata c join hrmresource h on c.id = h.id where h.id = ? and c.scopeid='1')",id);
                            rsCsd.next();
                            fieldValue = Util.null2String(rsCsd.getString("gzhsfw"));

                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }else {
						fieldValue = Util.null2String(rs.getString(fieldName));
						if (Util.null2String(kqReportFieldComInfo.getUnittype()).length() > 0) {
							if (fieldValue.length() == 0) {
								fieldValue = "0";
							} else {
								if (kqReportFieldComInfo.getUnittype().equals("2")) {
									fieldValue = KQDurationCalculatorUtil.getDurationRound(("" + (Util.getDoubleValue(fieldValue) / 60.0)));
								}
							}
						}
					}
					data.put(fieldName, fieldValue);
				}

				//请假
				List<Map<String, Object>> allLeaveRules = kqLeaveRulesBiz.getAllLeaveRules();
				Map<String, Object> leaveRule = null;
				for (int i = 0; allLeaveRules != null && i < allLeaveRules.size(); i++) {
					leaveRule = (Map<String, Object>) allLeaveRules.get(i);
					String flowType = Util.null2String("leaveType_" + leaveRule.get("id"));
					String leaveData = Util.null2String(flowData.get(id + "|" + flowType));
					String flowLeaveBackType = Util.null2String("leavebackType_" + leaveRule.get("id"));
					String leavebackData = Util.null2s(Util.null2String(flowData.get(id + "|" + flowLeaveBackType)), "0.0");
					String b_flowLeaveData = "";
					String flowLeaveData = "";
					try {
						//以防止出现精度问题
						if (leaveData.length() == 0) {
							leaveData = "0.0";
						}
						if (leavebackData.length() == 0) {
							leavebackData = "0.0";
						}
						BigDecimal b_leaveData = new BigDecimal(leaveData);
						BigDecimal b_leavebackData = new BigDecimal(leavebackData);
						b_flowLeaveData = b_leaveData.subtract(b_leavebackData).toString();
					} catch (Exception e) {
						writeLog("GetKQReportCmd:leaveData" + leaveData + ":leavebackData:" + leavebackData + ":" + e);
					}

					//考虑下冻结的数据
					if (b_flowLeaveData.length() > 0) {
						flowLeaveData = KQDurationCalculatorUtil.getDurationRound(b_flowLeaveData);
					} else {
						flowLeaveData = KQDurationCalculatorUtil.getDurationRound(Util.null2String(Util.getDoubleValue(leaveData, 0.0) - Util.getDoubleValue(leavebackData, 0.0)));
					}
					data.put(flowType, flowLeaveData);
				}

				Map<String, Object> detialDatas = kqReportBiz.getDetialDatas(id, fromDate, toDate, user);
				isEnd = false;
				for (String date = fromDate; !isEnd; ) {
					if (date.equals(toDate)) isEnd = true;
					if (DateUtil.compDate(today, date) > 0) {
						data.put(date, "");
					} else {
						data.put(date, detialDatas.get(id + "|" + date) == null ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : detialDatas.get(id + "|" + date));
					}
					cal.setTime(DateUtil.parseToDate(date));
					date = DateUtil.getDate(cal.getTime(), 1);
				}
				datas.add(data);
			}

			List<Object> lsHolidays = KQHolidaySetBiz.getHolidaySetListByScope(""+user.getUID(),fromDate,toDate);
			retmap.put("holidays", lsHolidays);

			retmap.put("columns",columns);
			retmap.put("datas",datas);
			retmap.put("pagesize", pageSize);
			retmap.put("pageindex", pageIndex);
			retmap.put("count", count);
			retmap.put("pagecount", pageCount);
			retmap.put("ishavepre", isHavePre);
			retmap.put("ishavenext", isHaveNext);
		}catch (Exception e){
			writeLog(e);
		}
		return retmap;
	}

	private Map<String,Object> getChildColumnsInfo(String parentid, User user){
		Map<String,Object> returnMap = new HashMap<>();
		List<Object> lsChildColumns = new ArrayList<>();
		Map column = null;
		int sumChildColumnWidth = 0;
		if(parentid.equals("attendanceSerial")){//考勤班次
			KQShiftManagementComInfo kqShiftManagementComInfo = new KQShiftManagementComInfo();
			JSONObject jsonObj = JSON.parseObject(Util.null2String(params.get("data")));
			List<String> serialIds = null;
			if(Util.null2String(jsonObj.get("attendanceSerial")).length()>0){
				serialIds = Util.splitString2List(Util.null2String(jsonObj.get("attendanceSerial")),",");
			}
			for(int i=0;serialIds!=null&&i<serialIds.size();i++){
				column = new HashMap();
				column.put("title", kqShiftManagementComInfo.getSerial(serialIds.get(i)));
				column.put("unit", "");
				column.put("width", 65);
				column.put("dataIndex", serialIds.get(i));
				column.put("key", serialIds.get(i));
        column.put("rowSpan", 2);
				column.put("colSpan", 1);
				sumChildColumnWidth+=65;
				lsChildColumns.add(column);
			}
		}else if(parentid.equals("leave")){
			KQLeaveRulesBiz kqLeaveRulesBiz = new KQLeaveRulesBiz();
			List<Map<String, Object>> leaveRules = kqLeaveRulesBiz.getAllLeaveRules();
			for(int i=0;leaveRules!=null&&i<leaveRules.size();i++){
				Map<String, Object> leaveRule = leaveRules.get(i);
				String id = "leaveType_"+Util.null2String(leaveRule.get("id"));
				String name = Util.null2String(leaveRule.get("name"));
				String unitType = Util.null2String(leaveRule.get("unitType"));
				column = new HashMap();
				column.put("title", name);
				column.put("unit", unitType.equals("3")?SystemEnv.getHtmlLabelName(391, user.getLanguage()):SystemEnv.getHtmlLabelName(1925, user.getLanguage()));
				column.put("width", 65);
				column.put("dataIndex", id);
				column.put("key", id);
				column.put("rowSpan", 2);
				column.put("colSpan", 1);
				column.put("showDetial","1");
				sumChildColumnWidth+=65;
				lsChildColumns.add(column);
			}
		}else if(parentid.equals("overtime")){
      String[] overtimeChild = {"overtime_nonleave","overtime_4leave","overtimeTotal"};
      for(int i=0;i<overtimeChild.length;i++){
        String id = overtimeChild[i];
        column = new HashMap();
        String fieldlabel = "";
        column.put("unit", "");
        if("overtime_nonleave".equalsIgnoreCase(id)){
          fieldlabel = "125805";
        }else if("overtime_4leave".equalsIgnoreCase(id)){
          fieldlabel = "125804";
        }else{
          fieldlabel = "523";
          column.put("showDetial","1");
          String unitType = KQOvertimeRulesBiz.getMinimumUnit()==3?"2":"1";
          String unitTypeName = "";
          if(Util.null2String(unitType).length()>0){
            if(unitType.equals("1")){
              unitTypeName=SystemEnv.getHtmlLabelName(1925, user.getLanguage());
            }else if(unitType.equals("2")){
              unitTypeName=SystemEnv.getHtmlLabelName(391, user.getLanguage());
            }else if(unitType.equals("3")){
              unitTypeName=SystemEnv.getHtmlLabelName(18083, user.getLanguage());
            }
          }
          column.put("unit", unitTypeName);
        }
        column.put("title", SystemEnv.getHtmlLabelNames(fieldlabel, user.getLanguage()));
        column.put("dataIndex", id);
        column.put("key", id);
        column.put("rowSpan", 1);
        Map<String,Object> mapChildColumnInfo = getChildColumnsInfo(id, user);
        int childWidth = 65;
        List<Object> childColumns = (List<Object>)mapChildColumnInfo.get("childColumns");
        if(childColumns.size()>0) {//跨列width取子列的width
          column.put("children", childColumns);
          childWidth = Util.getIntValue(Util.null2String(mapChildColumnInfo.get("sumChildColumnWidth")),65);
        }
        column.put("width", childWidth+"");
        sumChildColumnWidth+=childWidth;
        lsChildColumns.add(column);
      }
    }else{
			KQReportFieldComInfo kqReportFieldComInfo = new KQReportFieldComInfo();
			while (kqReportFieldComInfo.next()){
				if(kqReportFieldComInfo.getParentid().equals(parentid)) {
					column = new HashMap();
					column.put("title", SystemEnv.getHtmlLabelNames(kqReportFieldComInfo.getFieldlabel(), user.getLanguage()));
					column.put("unit", KQReportBiz.getUnitType(kqReportFieldComInfo, user));
					column.put("width", Util.getIntValue(kqReportFieldComInfo.getWidth()));
					column.put("dataIndex", kqReportFieldComInfo.getFieldname());
					column.put("key", kqReportFieldComInfo.getFieldname());
					column.put("rowSpan", 1);
					column.put("colSpan", 1);
					column.put("showDetial",kqReportFieldComInfo.getShowDetial());
					sumChildColumnWidth+=Util.getIntValue(kqReportFieldComInfo.getWidth());
					lsChildColumns.add(column);
				}
			}
		}
		returnMap.put("childColumns",lsChildColumns);
		returnMap.put("sumChildColumnWidth",sumChildColumnWidth);
		return returnMap;
	}

	@Override
	public BizLogContext getLogContext() {
		return null;
	}

}
